package com.deer.wms.inventory.dao;

import com.deer.wms.inventory.model.Inventory.*;
import com.deer.wms.inventory.model.stockTake.StockTakeMaster;
import com.deer.wms.project.root.mapper.SuperMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.util.List;
import java.util.Set;

public interface InventoryMapper extends SuperMapper<Inventory> {

    /**
     * 根据条件查询库存
     * @param criteria 查询条件
     * @return List<InventoryDto>
     */
    List<InventoryDto> findList(InventoryCriteria criteria);

    /**
     * 根据条件查询相同的库存
     * @param criteria 查询条件
     * @return Inventory
     */
    Inventory findSameInventory(InventoryCriteria criteria);

    Inventory findByItemWareOrg(@Param("itemCode") String itemCode,@Param("wareId") Integer wareId,@Param("orgId") Integer orgId,@Param("cellCode")String cellCode);
    Inventory findBatchId(@Param("batchId") Integer batchId);

    List<Inventory> getStockInventory(InventoryCriteria criteria);
    List<InventoryDto> findByCellUseType(InventoryCriteria criteria);

    List<InventorySelectDto> findByInventoryId(InventoryCriteria criteria);

    /**
     * 根据条件查询可出库库存
     * @param criteria 条件
     * @return List<InventorySelectDto>
     */
    List<InventorySelectDto> findCanBeOutOfStock(InventoryCriteria criteria);

    List<InventoryDto> canOut(InventoryCriteria criteria);

    List<Inventory>findSame(InventoryCriteria criteria);

    List<Inventory> findByCellCode(InventoryCriteria criteria);

    List<Inventory> findBatchInventory(InventoryCriteria criteria);

    List<Inventory> checkList(InventoryCriteria criteria);

    List inventorySafetyList(InventoryCriteria criteria);

    Double findByItemWareOrgGroupByItem(@Param("wareId") Integer wareId,@Param("orgId") Integer orgId,@Param("itemCode")String itemCode);

    List<Inventory> palletsToCombine(InventoryCriteria criteria);

    List<Inventory> inventoriesWithBoxCode(@Param("boxCode") String boxCode);

    List<GroupByWareOrgItem> findGroupByWareOrgItem(InventoryCriteria criteria);

    String findSameItemCell(@Param("itemCode") String itemCode,@Param("wareId") Integer wareId,@Param("orgId") Integer orgId);

    /**
     * 按照单据号发货
     * @param billNo 单据号
     * @param wareId 仓库id
     */
    void sendOut(@Param("billNo") String billNo, @Param("wareId") Integer wareId);

    List<Inventory> findBaoKuan(@Param("wareId") Integer wareId);

    List<Inventory> getInventoryByFromInfo(StockTakeMaster stockTakeMaster);

    Inventory getAccept(@Param("inventoryId") Integer inventoryId,@Param("wareId") Integer wareId);

    /**
     * 获取库位上的容器数量
     * @param cellCode 库位
     * @return 数量
     */
    Integer getBoxNumInCell(String cellCode);


    List<Inventory> selectItemInfo(@Param("cellCode") String cellCode,@Param("boxCode") String boxCode);

    List<Inventory> findByItemCode(Integer wareId, String itemCode);
    List<Inventory> list();


    /**
     * 获取所有分页数量
     * @return
     */
    long getTotal();


    /***
     * findBySrcCode
     * @param srcBoxCode
     * @return
     */
    Integer findBySrcCode(@Param("srcBoxCode") String srcBoxCode,@Param("itemCode") String itemCode);

    List<InventoryDto> soList(InventoryCriteria criteria);


    /**
     * VMI查询
     * @param criteria
     * @return
     */
    List<InventoryDto> vmiList(InventoryCriteria criteria);

    long findCount(InventoryCriteria criteria);



    void updateBatch();

    List<InventorySelectDto> findebyId(Integer inventoryId);

    InventorySelectDto findbyInv(String allotDetailNo);

    List<InventorySelectDto> findCanBeOutOfIds(InventoryCriteria criteria);

    List<InventoryExcel> dowLoadList(InventoryCriteria criteria);

    List<InventoryDto> findLast(@Param("list") List<Integer> invIds);



    List<InventoryDto> findGroupList(InventoryCriteria criteria);

}